package com.siyu.single.v2;

/**
 * @Author: siyu
 * @CreateTime: 2024-10-06
 * @Version: 1.0
 */
public class SingleObject {

    private volatile static SingleObject singleObject;

    private SingleObject() {
    }

    public static SingleObject getSingleObject() {

        if (singleObject == null) {  // 第一次判断，如果 singleObject 不为空直接返回，防止不必要的开销
            synchronized (SingleObject.class) {  // 加锁 防止多线程下的线程安全问题
                if (singleObject == null) { // 第二次检查，这是必要的，因为当多个线程同时通过第一次检查时，只有一个线程能够进入同步块，而其他线程会被阻塞。当第一个线程创建对象后，其他线程在进入同步块时需要通过第二次检查来确认对象是否已经被创建。
                    singleObject = new SingleObject();
                }
            }
        }
        return singleObject;
    }
}
